Welcome to the BSF Facility

Hello, welcome to the SOP for the BSF project for Evolab & Reprolab. Read the Reprolab’s onboarding documents and get yourself added to the lab’s MS Teams.

We would recommend heading over to the Mass rearing folder in General Literature and reading the BSF manuals there. That should give you a good overview of the BSF rearing process.

Lab equipment

We have a number of equipment in the BSF facility that may be used. These include:

  • Food grinder
  • Mechanical sieve and smaller hand sieves
  • Feeding trays
  • Cages of different sizes (XL:60x60x180cm , L: 60x60x90cm, M: 30x30x60cm, S: 30x30x30cm)*
  • Racks, fixed and wheeled
  • Lights
  • Freezers
  • Balance (up to 0.001g)

* We also have five XXL cages and a giant cage set up around the facility for large number of flies.

Please read the relevant RAs before using them. Wash the equipment after using it.

BSF cultures

Currently, we have five selection lines of BSF, labeled A to E. We are in the process of establishing more lines of local flies. The maintence procedures are outlined below in this document.

Data recording

In each of the below steps, there are things to be recorded in the MS Teams ‘BSF Facility data records’ sheet. Please refer to the readme sheet in the document to familiarise yourself with it.


Food waste

Food waste sources

For this project, one of the goals is to recycle the foodwaste around the campus. We have targeted the residential halls and colleges that provide meal plans as they seem to form the bulk of the food waste produced. There are currently nine halls and colleges that we collect food waste from. These are:

  • Eusoff Hall
  • Kent Ridge Hall
  • King Edward VII (KEVII) Hall
  • Raffles Hall
  • Sheares Hall
  • Temasek Hall
  • Cinnamon & Tembusu Colleges
  • College of Alice and Peter Tan (CAPT) & Residential College 4 (RC4)
  • Ridge View Residential College

The meal plans in these halls and colleges are operated by a number of different caterers. Do check at the start of the academic year if there has been any changes in the caterer. If so, contact the dining service manager or the catering company’s manager to arrange collection of the food waste.

Food waste collection

Food waste amount

We will collect leftover dining hall food from participating Residential Colleges and Halls. Buffet-style meals are served twice daily, in the morning and evening, after which, the leftover food that remains in the serving tray is normally discarded. Instead of depositing the leftover food in the trash, the dining hall staff will put the leftover food into our wheeled 80L collection bins for our collection each day. The Office of Sustainability suggests that all of the RC dining halls have similar food service operations (buffet-style) and food amounts as RVRC (~40kg/day of leftovers including both breakfast and dinner). Assuming that we can source food from all nine halls and colleges, we will likely be able to source ~350-400kg/day.

Food waste collection arrangements

We would collect food Monday - Friday. Each collection will include the previous night’s dinner as well as that morning’s breakfast at the same time, sometime between 10:30 - 11:30am each weekday morning at a designated pickup/dropoff usually located near to the bin center of the halls. As such, dining staff would not collect Friday dinner, but would collect Sunday dinner for collection with Monday’s breakfast. At the time of collection, we will drop off two empty bins for the next collection.

Because there are no refrigerators at the dining halls, we would provide the dining halls with two, 2-wheeled 80-L bins in which to place the buffet leftovers after each meal (one bin each for dinner and breakfast). We eventually came to an agreement with the operators that as long as the bins are covered and kept away from the kitchen area, a standard, non-sealing wheelie bin should be fine.

Fig 1. Food waste collection route.

School holidays

During the semester break, the food service will not be running. Alternative arrangements from outside the campus will have to be made to tide ths BSFs over during this time. Some food waste may be collected from the canteen operators but this is unlikely to be sufficient. We have tried to stock up on dry goods such as biscuits as feed but this is not optimal for BSFs. We noticed higher than normal mortality in the trays during this period. Food service should resume a week before the new semester starts.

Food waste processing

On returning from food collection, bins containing food waste are unloaded from the lorry bed manually. They are then wheeled to the main area and weighed. The food waste is then fed into the grinder or handheld mixer depending on the amount of food waste collected. If the food waste is too dry, water might have to be added. If the food waste is too wet, dry substrate such as bread or biscuits will be added to reduce the wetness of the food. These additional steps helps to homogenise the quality of food waste and the optimal moisture content for the larval consumption.


Nursery

Egg traps are replaced every Monday, Wednesday and Thursday. The eggs are collected from the mating cages should be between 2-3 days old. The egg traps are then weighed to determine the weight of eggs on it. Nurseries should be set up immediately in case of early hatching. Currently, nurseries are made using chicken feed sourced from Lian Wah Hang Quail Poultry Farm. Generally, ~100g of dry chicken feed is added to 1g of BSF eggs at 60% moisture, rounded to the closest 0.1g of eggs. A maximum of 5g of eggs in used in each nursery as the chicken feed layer will get too thick.

Mass of eggs (g) Dry chicken feed (g) Water (g) Container size
<1 100 150 Small
1-2 100-200 150-300 Medium
2-3 200-300 300-450 Large
3-4 300-400 450-600 Large
4-5 400-500 600-750 Large

Once the chicken feed has been mixed with water, we let it sit for an hour. The chicken feed will absorb the water and cake up. Thoroughly mix the moistened chicken feed and add a layer of dry coco peat. Ensure the egg traps remain dry by placing them on top of the coco peat. An elevated platform made of flexible wire mesh or a mini steaming tripod can be used to support the egg traps. The nurseries are then covered with a paper towel which is secured by a cut-out cover to prevent phorids from infesting the nursery. They are placed in individual small cages before being put into the large cage according to their line. The nurseries are left there for one to two weeks before being trayed. Midway through, it is good to mix and aerate the nurseries to prevent any caking of the chicken feed.

Using chicken feed (~$3/kg) nurseries will add on quite a substantial amount to our expenses. Food waste nurseries are probably more financially sustainable but it might lead to losses from escapees. We have tried food waste nurseries before but did not quantify losses. Nurseries comprised of a food waste + chicken feed (or okara) mix have shown to be effective, and could minimize escapes by being slightly drier and provide more structure to the substrate. This will require further investigation to determine a suitable nursery mix.

Misc tips

  • We buy 25kg of chicken feed each time. This lasts us about 1-2 months depending on the amount of eggs collected. We store the bag of chicken feed in a vacuum bag and remove the air using a wet/dry vacuum. This seems to allow us to keep the chicken feed fresh for a longer time and prevents the spread of mites.

  • Lightly knock the side of the cage to chase the flies away before retrieving the trap. A quick flick of the trap should get rid of most flies without damaging the eggs. If the trap is very full, sweeping off the flies with a finger might be preferable.

  • The BSFs commonly oviposit along the zips of the cages. If you are not careful, you may bring eggs from one cage to another and mix up the lines.


Traying and feeding

Nursery quantification and traying

After about 7-10 days, the nurseries should be ready (dry) to be trayed. Smaller nurseries tend to dry up sooner than the large ones. It might be helpful to remove the cardboard traps to encourage more airflow and faster drying times. Wet cardboard also tends to breakdown in the nursery which makes sieving it more difficult.

Once the nursery is ready (dry), we will remove as much substrate as possible from each nursery (ie dried clumps with no larvae). This is done by sieving the mixture through an appropriate small sieve (~1mm and ~4mm). The remaining larvae tends to clump together in panic and more substrate can be removed by skimming off the top substrate. The larvae and remaining substrate will be homogenized. The number of larvae in the nursery is estimated by counting the number in a small sample (3 x ~1.5g), which is then extrapolated based on the total weight of the nursery. The larvae are then distributed into batches of approximately 10,000, which are then added to each blue tray with food waste.

Feeding

Ideally, each tray would be fed once at the start of it’s lifespan, enough for the maggots to reach maturity. We have done some preliminary trials and a ratio of 3-5kg : 10,000 maggots in a blue tray seem to do quite well. However, due to concerns with odours and escapees, we have changed to multiple feedings.

Each tray starts out with one large scoop of spent grains or okara (~800g?). A depression is made in the center of the scoop and a scoop of food waste is placed in the center in the depression. The grains provide a dryer substrate and seem quite effective in discouraging maggots from escaping. Each new tray is labeled as such: Line-traydate-s/n. For example of maggots from line D, trayed on 10 Sep 2020 will be labelled as ‘D-10092020-01’, ‘D-10092020-02’ and so on. The nursery number is also noted down to allow us to ttrack the performance of specific nurseries. The trays are then placed on their respective racks.

For existing trays, an additional scoop of food waste is added to the tray every Monday, Wednesday and Friday or when the substrate is dry. With certain types of food wastes (such as biscuits), the substrate tends to dry quickly and cake up. Watering and mixing might need to be done on an ad hoc basis if you notice caking. This should not be an issue with foodwaste, okara or grains. The trays continue to receive food until an estimated 40% of the larvae have prepupated.


Harvesting

Small scale harvesting

If your experiment is on a smaller scale (yellow trays or smaller), you may consider letting the larvae self harvest as prepuae migrate from wetter areas in search of dry substrate to pupate in. This can be done by placing a yellow tray in a larger blue tray and adding a wooden ramp on the short side of the yellow tray. The self harvesting method will not get all the prepupae out but it may be sufficient for your needs. This can be combined together with manual handheld sieving to get even more prepupae out of the trays. If the resultant frass is not important at the end of the experiment, you may want to flood the yellow tray and add coco peat in the blue tray. This will chase out most of the prepupae but the frass is lost.

Large scale harvesting

For the operations of the BSF facility, self harvest is too slow. Instead, we use the large mechanical sieve. It can fit up to three layers of sieves with meshes of different sizes. We have a number of sieves of different sizes that can be swapped depending on your needs (10mm, 5mm, 3mm etc). The 5mm screen is most often used. The maggot tray should be dry or the frass will clump up at the bottom.

Fig 2. Mechanical sieve with alternative screens behind.

When ready, turn the sieve on and pour the tray in the center of the screen. Fine frass will fall through to the bottom layer while larger frass and maggots are retained on the upper layers. We usually do two passes through the sieve by re-sieving the finest frass. This should remove most all of the prepupae from the frass. Clean the screens and the bottom to ensure that maggots of different lines do not mix. Run the siever for a short while to get the stragglers out from the chute before moving on to the next tray. If you notice loud noises while sieving, the nuts might need to be further tightened. Tightening (or loosening) can be done quickly by using a drill with an adapter for the nut. If the tray is still wet, the sieve will not work well. Let the tray dry out for a day before assessing it again.

After sieving, a few measurements for the trays have to be taken. Firstly, we weigh the frass and residue produced by the tray. Next, we weigh the mass of the larvae. Lastly, prepupae percentage is estimated by counting a few samples of larvae. This is done for a minimum of three random trays per batch (per line per date). The frass goes into the designated frass bins for composting or stored for botany or other gardening interest groups. The trays of larvae are placed inside a large cage and goes to the dark room. Each cage is to have between one to two trays worth of maggots (total ~20,000 per cage). Remember to label the cage so that we are able to track the amount of eggs from each cage.

Fig 3. BSF frass

Currently (Dec 2020), we are still rebuilding our populations after the circuit breaker. When it reaches a point where we have more than enough adult flies, some trays can be harvested earlier for other purposes.


Obtaining eggs

Large cages

Dark

Once the trays are placed in the cages, the cages are placed in the dark room to build up a larger population of flies. Once a large population of flies is established in a cage, it is brought out into the into and placed along the row of windows.

Light

Once the cage is by the windows, a small tray of sugar water with sponges can placed in the cage for the flies. This can be topped up twice a week. Two days after being brought into the light, a bait box with an egg trap is added into the cage. The bait box is made using chicken feed and frass from sieving. It should be made more watery as it is expected to last for at least 2 weeks. These cages are lit by natural sunlight.

Fig 4. BSF bait boxes with traps

XXL and beyond

If the row beside the window is fully used, we have a a number of XXL cages set up around the facility and a giant cage in the small office. The XXL cages and giant cage in the rooms are lit using artificial lighting. These are supposed to be optimised based on the visible spectrum of the BSFs. Please wear eye protection before going into the rooms if the lights are on. The egg production with these cages have not been as good as the large cages, perhaps due to a lower density but more testing should be done ¯\_(ツ)_/¯.

Fig 5. Wavelength of LEDs in the rooms from the manufacturer

Egg traps

We have implemented the use of 2 different types of egg traps: wooden traps and cardboard traps. Label cage the trap is from so that we can track the performance of the cages. Traps are replaced every Monday, Wednesday and Friday until the cage is decommissioned when most of the flies have died.

Wooden trap

Wooden traps are made by bundling four layers of wood, separated by thin wooden spacers. More traps can be made by cutting wooden planks to size with the saw. Using wooden traps, eggs can be gently scraped out using a penknife to obtain the egg weight. Scrap along the wooden grain to minimise damage to eggs. The eggs are scraped out onto a thin plastic card which can be placed in the nursery. The traps are then placed in the dehydrator for one to two hours to kill off any remaining eggs. Once cooled, the trap can be used again.

Fig 6. Example of a wooden trap

Cardbaord traps.

Cardboard traps are made by bundling 3-4 layers of cardboard. Each trap is approximately 15x1.5cm. After the trap has been secured with a rubber band, weigh the trap and write it on the cardboard. The weight of eggs on the trap can be obtained by subtracting the final weight from the initial weight of the trap. The cardboard traps can be placed directly in the nurseries.

Fig 7. Example of a cardboard trap

LS0tDQp0aXRsZTogIkJTRiBTT1AiDQphdXRob3I6ICJCU0YgdGVhbSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgbWRfZG9jdW1lbnQ6DQogICAgdmFyaWFudDogbWFya2Rvd25fZ2l0aHViDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGtlZXBfbWQ6IHllcw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMgV2VsY29tZSB0byB0aGUgQlNGIEZhY2lsaXR5DQpIZWxsbywgd2VsY29tZSB0byB0aGUgU09QIGZvciB0aGUgQlNGIHByb2plY3QgZm9yIEV2b2xhYiAmIFJlcHJvbGFiLiBSZWFkIHRoZSBSZXByb2xhYidzIG9uYm9hcmRpbmcgZG9jdW1lbnRzIGFuZCBnZXQgeW91cnNlbGYgYWRkZWQgdG8gdGhlIGxhYidzIE1TIFRlYW1zLg0KDQoNCldlIHdvdWxkIHJlY29tbWVuZCBoZWFkaW5nIG92ZXIgdG8gdGhlIE1hc3MgcmVhcmluZyBmb2xkZXIgaW4gR2VuZXJhbCBMaXRlcmF0dXJlIGFuZCByZWFkaW5nIHRoZSBCU0YgbWFudWFscyB0aGVyZS4gVGhhdCBzaG91bGQgZ2l2ZSB5b3UgYSBnb29kIG92ZXJ2aWV3IG9mIHRoZSBCU0YgcmVhcmluZyBwcm9jZXNzLg0KDQojIyBMYWIgZXF1aXBtZW50DQpXZSBoYXZlIGEgbnVtYmVyIG9mIGVxdWlwbWVudCBpbiB0aGUgQlNGIGZhY2lsaXR5IHRoYXQgbWF5IGJlIHVzZWQuIFRoZXNlIGluY2x1ZGU6DQoNCiAgKyBGb29kIGdyaW5kZXINCiAgKyBNZWNoYW5pY2FsIHNpZXZlIGFuZCBzbWFsbGVyIGhhbmQgc2lldmVzDQogICsgRmVlZGluZyB0cmF5cw0KICArIENhZ2VzIG9mIGRpZmZlcmVudCBzaXplcyAoWEw6NjB4NjB4MTgwY20gLCBMOiA2MHg2MHg5MGNtLCBNOiAzMHgzMHg2MGNtLCBTOiAzMHgzMHgzMGNtKSoNCiAgKyBSYWNrcywgZml4ZWQgYW5kIHdoZWVsZWQNCiAgKyBMaWdodHMNCiAgKyBGcmVlemVycw0KICArIEJhbGFuY2UgKHVwIHRvIDAuMDAxZykNCg0KXCogV2UgYWxzbyBoYXZlIGZpdmUgWFhMIGNhZ2VzIGFuZCBhIGdpYW50IGNhZ2Ugc2V0IHVwIGFyb3VuZCB0aGUgZmFjaWxpdHkgZm9yIGxhcmdlIG51bWJlciBvZiBmbGllcy4NCg0KDQpQbGVhc2UgcmVhZCB0aGUgcmVsZXZhbnQgUkFzIGJlZm9yZSB1c2luZyB0aGVtLiBXYXNoIHRoZSBlcXVpcG1lbnQgYWZ0ZXIgdXNpbmcgaXQuIA0KDQojIyMgQlNGIGN1bHR1cmVzDQpDdXJyZW50bHksIHdlIGhhdmUgZml2ZSBzZWxlY3Rpb24gbGluZXMgb2YgQlNGLCBsYWJlbGVkIEEgdG8gRS4gV2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGVzdGFibGlzaGluZyBtb3JlIGxpbmVzIG9mIGxvY2FsIGZsaWVzLiBUaGUgbWFpbnRlbmNlIHByb2NlZHVyZXMgYXJlIG91dGxpbmVkIGJlbG93IGluIHRoaXMgZG9jdW1lbnQuDQoNCiMjIERhdGEgcmVjb3JkaW5nDQpJbiBlYWNoIG9mIHRoZSBiZWxvdyBzdGVwcywgdGhlcmUgYXJlIHRoaW5ncyB0byBiZSByZWNvcmRlZCBpbiB0aGUgTVMgVGVhbXMgJ0JTRiBGYWNpbGl0eSBkYXRhIHJlY29yZHMnIHNoZWV0LiBQbGVhc2UgcmVmZXIgdG8gdGhlIHJlYWRtZSBzaGVldCBpbiB0aGUgZG9jdW1lbnQgdG8gZmFtaWxpYXJpc2UgeW91cnNlbGYgd2l0aCBpdC4NCg0KLS0tDQoNCiMgRm9vZCB3YXN0ZQ0KIyMgRm9vZCB3YXN0ZSBzb3VyY2VzDQpGb3IgdGhpcyBwcm9qZWN0LCBvbmUgb2YgdGhlIGdvYWxzIGlzIHRvIHJlY3ljbGUgdGhlIGZvb2R3YXN0ZSBhcm91bmQgdGhlIGNhbXB1cy4gV2UgaGF2ZSB0YXJnZXRlZCB0aGUgcmVzaWRlbnRpYWwgaGFsbHMgYW5kIGNvbGxlZ2VzIHRoYXQgcHJvdmlkZSBtZWFsIHBsYW5zIGFzIHRoZXkgc2VlbSB0byBmb3JtIHRoZSBidWxrIG9mIHRoZSBmb29kIHdhc3RlIHByb2R1Y2VkLiBUaGVyZSBhcmUgY3VycmVudGx5IG5pbmUgaGFsbHMgYW5kIGNvbGxlZ2VzIHRoYXQgd2UgY29sbGVjdCBmb29kIHdhc3RlIGZyb20uIFRoZXNlIGFyZToNCg0KICArIEV1c29mZiBIYWxsDQogICsgS2VudCBSaWRnZSBIYWxsDQogICsgS2luZyBFZHdhcmQgVklJIChLRVZJSSkgSGFsbA0KICArIFJhZmZsZXMgSGFsbA0KICArIFNoZWFyZXMgSGFsbA0KICArIFRlbWFzZWsgSGFsbA0KICArIENpbm5hbW9uICYgVGVtYnVzdSBDb2xsZWdlcw0KICArIENvbGxlZ2Ugb2YgQWxpY2UgYW5kIFBldGVyIFRhbiAoQ0FQVCkgJiBSZXNpZGVudGlhbCBDb2xsZWdlIDQgKFJDNCkNCiAgKyBSaWRnZSBWaWV3IFJlc2lkZW50aWFsIENvbGxlZ2UNCg0KVGhlIG1lYWwgcGxhbnMgaW4gdGhlc2UgaGFsbHMgYW5kIGNvbGxlZ2VzIGFyZSBvcGVyYXRlZCBieSBhIG51bWJlciBvZiBkaWZmZXJlbnQgY2F0ZXJlcnMuIERvIGNoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYWNhZGVtaWMgeWVhciBpZiB0aGVyZSBoYXMgYmVlbiBhbnkgY2hhbmdlcyBpbiB0aGUgY2F0ZXJlci4gSWYgc28sIGNvbnRhY3QgdGhlIGRpbmluZyBzZXJ2aWNlIG1hbmFnZXIgb3IgdGhlIGNhdGVyaW5nIGNvbXBhbnkncyBtYW5hZ2VyIHRvIGFycmFuZ2UgY29sbGVjdGlvbiBvZiB0aGUgZm9vZCB3YXN0ZS4NCg0KDQojIyBGb29kIHdhc3RlIGNvbGxlY3Rpb24NCiMjIyBGb29kIHdhc3RlIGFtb3VudA0KV2Ugd2lsbCBjb2xsZWN0IGxlZnRvdmVyIGRpbmluZyBoYWxsIGZvb2QgZnJvbSBwYXJ0aWNpcGF0aW5nIFJlc2lkZW50aWFsIENvbGxlZ2VzIGFuZCBIYWxscy4gQnVmZmV0LXN0eWxlIG1lYWxzIGFyZSBzZXJ2ZWQgdHdpY2UgZGFpbHksIGluIHRoZSBtb3JuaW5nIGFuZCBldmVuaW5nLCBhZnRlciB3aGljaCwgdGhlIGxlZnRvdmVyIGZvb2QgdGhhdCByZW1haW5zIGluIHRoZSBzZXJ2aW5nIHRyYXkgaXMgbm9ybWFsbHkgZGlzY2FyZGVkLiBJbnN0ZWFkIG9mIGRlcG9zaXRpbmcgdGhlIGxlZnRvdmVyIGZvb2QgaW4gdGhlIHRyYXNoLCB0aGUgZGluaW5nIGhhbGwgc3RhZmYgd2lsbCBwdXQgdGhlIGxlZnRvdmVyIGZvb2QgaW50byBvdXIgd2hlZWxlZCA4MEwgY29sbGVjdGlvbiBiaW5zIGZvciBvdXIgY29sbGVjdGlvbiBlYWNoIGRheS4gVGhlIE9mZmljZSBvZiBTdXN0YWluYWJpbGl0eSBzdWdnZXN0cyB0aGF0IGFsbCBvZiB0aGUgUkMgZGluaW5nIGhhbGxzIGhhdmUgc2ltaWxhciBmb29kIHNlcnZpY2Ugb3BlcmF0aW9ucyAoYnVmZmV0LXN0eWxlKSBhbmQgZm9vZCBhbW91bnRzIGFzIFJWUkMgKH40MGtnL2RheSBvZiBsZWZ0b3ZlcnMgaW5jbHVkaW5nIGJvdGggYnJlYWtmYXN0IGFuZCBkaW5uZXIpLiBBc3N1bWluZyB0aGF0IHdlIGNhbiBzb3VyY2UgZm9vZCBmcm9tIGFsbCBuaW5lIGhhbGxzIGFuZCBjb2xsZWdlcywgd2Ugd2lsbCBsaWtlbHkgYmUgYWJsZSB0byBzb3VyY2UgfjM1MC00MDBrZy9kYXkuDQoNCiMjIyBGb29kIHdhc3RlIGNvbGxlY3Rpb24gYXJyYW5nZW1lbnRzDQpXZSB3b3VsZCBjb2xsZWN0IGZvb2QgTW9uZGF5IC0gRnJpZGF5LiBFYWNoIGNvbGxlY3Rpb24gd2lsbCBpbmNsdWRlIHRoZSBwcmV2aW91cyBuaWdodOKAmXMgZGlubmVyIGFzIHdlbGwgYXMgdGhhdCBtb3JuaW5n4oCZcyBicmVha2Zhc3QgYXQgdGhlIHNhbWUgdGltZSwgc29tZXRpbWUgYmV0d2VlbiAxMDozMCAtIDExOjMwYW0gZWFjaCB3ZWVrZGF5IG1vcm5pbmcgYXQgYSBkZXNpZ25hdGVkIHBpY2t1cC9kcm9wb2ZmIHVzdWFsbHkgbG9jYXRlZCBuZWFyIHRvIHRoZSBiaW4gY2VudGVyIG9mIHRoZSBoYWxscy4gQXMgc3VjaCwgZGluaW5nIHN0YWZmIHdvdWxkIG5vdCBjb2xsZWN0IEZyaWRheSBkaW5uZXIsIGJ1dCB3b3VsZCBjb2xsZWN0IFN1bmRheSBkaW5uZXIgZm9yIGNvbGxlY3Rpb24gd2l0aCBNb25kYXnigJlzIGJyZWFrZmFzdC4gQXQgdGhlIHRpbWUgb2YgY29sbGVjdGlvbiwgd2Ugd2lsbCBkcm9wIG9mZiB0d28gZW1wdHkgYmlucyBmb3IgdGhlIG5leHQgY29sbGVjdGlvbi4NCg0KDQpCZWNhdXNlIHRoZXJlIGFyZSBubyByZWZyaWdlcmF0b3JzIGF0IHRoZSBkaW5pbmcgaGFsbHMsIHdlIHdvdWxkIHByb3ZpZGUgdGhlIGRpbmluZyBoYWxscyB3aXRoIHR3bywgMi13aGVlbGVkIDgwLUwgYmlucyBpbiB3aGljaCB0byBwbGFjZSB0aGUgYnVmZmV0IGxlZnRvdmVycyBhZnRlciBlYWNoIG1lYWwgKG9uZSBiaW4gZWFjaCBmb3IgZGlubmVyIGFuZCBicmVha2Zhc3QpLiBXZSBldmVudHVhbGx5IGNhbWUgdG8gYW4gYWdyZWVtZW50IHdpdGggdGhlIG9wZXJhdG9ycyB0aGF0IGFzIGxvbmcgYXMgdGhlIGJpbnMgYXJlIGNvdmVyZWQgYW5kIGtlcHQgYXdheSBmcm9tIHRoZSBraXRjaGVuIGFyZWEsIGEgc3RhbmRhcmQsIG5vbi1zZWFsaW5nIHdoZWVsaWUgYmluIHNob3VsZCBiZSBmaW5lLg0KDQoNCiFbRmlnIDEuIEZvb2Qgd2FzdGUgY29sbGVjdGlvbiByb3V0ZS5dKGltYWdlcy9GV19yb3V0ZS5QTkcpe3dpZHRoPTcwJX0NCg0KDQojIyMgU2Nob29sIGhvbGlkYXlzDQpEdXJpbmcgdGhlIHNlbWVzdGVyIGJyZWFrLCB0aGUgZm9vZCBzZXJ2aWNlIHdpbGwgbm90IGJlIHJ1bm5pbmcuIEFsdGVybmF0aXZlIGFycmFuZ2VtZW50cyBmcm9tIG91dHNpZGUgdGhlIGNhbXB1cyB3aWxsIGhhdmUgdG8gYmUgbWFkZSB0byB0aWRlIHRocyBCU0ZzIG92ZXIgZHVyaW5nIHRoaXMgdGltZS4gU29tZSBmb29kIHdhc3RlIG1heSBiZSBjb2xsZWN0ZWQgZnJvbSB0aGUgY2FudGVlbiBvcGVyYXRvcnMgYnV0IHRoaXMgaXMgdW5saWtlbHkgdG8gYmUgc3VmZmljaWVudC4gV2UgaGF2ZSB0cmllZCB0byBzdG9jayB1cCBvbiBkcnkgZ29vZHMgc3VjaCBhcyBiaXNjdWl0cyBhcyBmZWVkIGJ1dCB0aGlzIGlzIG5vdCBvcHRpbWFsIGZvciBCU0ZzLiBXZSBub3RpY2VkIGhpZ2hlciB0aGFuIG5vcm1hbCBtb3J0YWxpdHkgaW4gdGhlIHRyYXlzIGR1cmluZyB0aGlzIHBlcmlvZC4gRm9vZCBzZXJ2aWNlIHNob3VsZCByZXN1bWUgYSB3ZWVrIGJlZm9yZSB0aGUgbmV3IHNlbWVzdGVyIHN0YXJ0cy4gIA0KDQoNCiMjIEZvb2Qgd2FzdGUgcHJvY2Vzc2luZw0KT24gcmV0dXJuaW5nIGZyb20gZm9vZCBjb2xsZWN0aW9uLCBiaW5zIGNvbnRhaW5pbmcgZm9vZCB3YXN0ZSBhcmUgdW5sb2FkZWQgZnJvbSB0aGUgbG9ycnkgYmVkIG1hbnVhbGx5LiBUaGV5IGFyZSB0aGVuIHdoZWVsZWQgdG8gdGhlIG1haW4gYXJlYSBhbmQgd2VpZ2hlZC4gVGhlIGZvb2Qgd2FzdGUgaXMgdGhlbiBmZWQgaW50byB0aGUgZ3JpbmRlciBvciBoYW5kaGVsZCBtaXhlciBkZXBlbmRpbmcgb24gdGhlIGFtb3VudCBvZiBmb29kIHdhc3RlIGNvbGxlY3RlZC4gSWYgdGhlIGZvb2Qgd2FzdGUgaXMgdG9vIGRyeSwgd2F0ZXIgbWlnaHQgaGF2ZSB0byBiZSBhZGRlZC4gSWYgdGhlIGZvb2Qgd2FzdGUgaXMgdG9vIHdldCwgZHJ5IHN1YnN0cmF0ZSBzdWNoIGFzIGJyZWFkIG9yIGJpc2N1aXRzIHdpbGwgYmUgYWRkZWQgdG8gcmVkdWNlIHRoZSB3ZXRuZXNzIG9mIHRoZSBmb29kLiBUaGVzZSBhZGRpdGlvbmFsIHN0ZXBzIGhlbHBzIHRvIGhvbW9nZW5pc2UgdGhlIHF1YWxpdHkgb2YgZm9vZCB3YXN0ZSBhbmQgdGhlIG9wdGltYWwgbW9pc3R1cmUgY29udGVudCBmb3IgdGhlIGxhcnZhbCBjb25zdW1wdGlvbi4gIA0KDQotLS0NCg0KIyBOdXJzZXJ5DQpFZ2cgdHJhcHMgYXJlIHJlcGxhY2VkIGV2ZXJ5IE1vbmRheSwgV2VkbmVzZGF5IGFuZCBUaHVyc2RheS4gVGhlIGVnZ3MgYXJlIGNvbGxlY3RlZCBmcm9tIHRoZSBtYXRpbmcgY2FnZXMgc2hvdWxkIGJlIGJldHdlZW4gIDItMyBkYXlzIG9sZC4gVGhlIGVnZyB0cmFwcyBhcmUgdGhlbiB3ZWlnaGVkIHRvIGRldGVybWluZSB0aGUgd2VpZ2h0IG9mIGVnZ3Mgb24gaXQuIE51cnNlcmllcyBzaG91bGQgYmUgc2V0IHVwIGltbWVkaWF0ZWx5IGluIGNhc2Ugb2YgZWFybHkgaGF0Y2hpbmcuIEN1cnJlbnRseSwgbnVyc2VyaWVzIGFyZSBtYWRlIHVzaW5nIGNoaWNrZW4gZmVlZCBzb3VyY2VkIGZyb20gTGlhbiBXYWggSGFuZyBRdWFpbCBQb3VsdHJ5IEZhcm0uIEdlbmVyYWxseSwgfjEwMGcgb2YgZHJ5IGNoaWNrZW4gZmVlZCBpcyBhZGRlZCB0byAxZyBvZiBCU0YgZWdncyBhdCA2MCUgbW9pc3R1cmUsIHJvdW5kZWQgdG8gdGhlIGNsb3Nlc3QgMC4xZyBvZiBlZ2dzLiBBIG1heGltdW0gb2YgNWcgb2YgZWdncyBpbiB1c2VkIGluIGVhY2ggbnVyc2VyeSBhcyB0aGUgY2hpY2tlbiBmZWVkIGxheWVyIHdpbGwgZ2V0IHRvbyB0aGljay4NCg0KTWFzcyBvZiBlZ2dzIChnKSB8IERyeSBjaGlja2VuIGZlZWQgKGcpIHwgV2F0ZXIgKGcpIHwgQ29udGFpbmVyIHNpemUNCi0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0NCjwxIHwgMTAwIHwgMTUwIHwgU21hbGwNCjEtMiB8IDEwMC0yMDAgfCAxNTAtMzAwIHwgTWVkaXVtDQoyLTMgfCAyMDAtMzAwIHwgMzAwLTQ1MCB8IExhcmdlDQozLTQgfCAzMDAtNDAwIHwgNDUwLTYwMCB8IExhcmdlDQo0LTUgfCA0MDAtNTAwIHwgNjAwLTc1MCB8IExhcmdlDQoNCg0KT25jZSB0aGUgY2hpY2tlbiBmZWVkIGhhcyBiZWVuIG1peGVkIHdpdGggd2F0ZXIsIHdlIGxldCBpdCBzaXQgZm9yIGFuIGhvdXIuIFRoZSBjaGlja2VuIGZlZWQgd2lsbCBhYnNvcmIgdGhlIHdhdGVyIGFuZCBjYWtlIHVwLiBUaG9yb3VnaGx5IG1peCB0aGUgbW9pc3RlbmVkIGNoaWNrZW4gZmVlZCBhbmQgYWRkIGEgbGF5ZXIgb2YgZHJ5IGNvY28gcGVhdC4gRW5zdXJlIHRoZSBlZ2cgdHJhcHMgcmVtYWluIGRyeSBieSBwbGFjaW5nIHRoZW0gb24gdG9wIG9mIHRoZSBjb2NvIHBlYXQuIEFuIGVsZXZhdGVkIHBsYXRmb3JtIG1hZGUgb2YgZmxleGlibGUgd2lyZSBtZXNoIG9yIGEgbWluaSBzdGVhbWluZyB0cmlwb2QgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCB0aGUgZWdnIHRyYXBzLiBUaGUgbnVyc2VyaWVzIGFyZSB0aGVuIGNvdmVyZWQgd2l0aCBhIHBhcGVyIHRvd2VsIHdoaWNoIGlzIHNlY3VyZWQgYnkgYSBjdXQtb3V0IGNvdmVyIHRvIHByZXZlbnQgcGhvcmlkcyBmcm9tIGluZmVzdGluZyB0aGUgbnVyc2VyeS4gVGhleSBhcmUgcGxhY2VkIGluIGluZGl2aWR1YWwgc21hbGwgY2FnZXMgYmVmb3JlIGJlaW5nIHB1dCBpbnRvIHRoZSBsYXJnZSBjYWdlIGFjY29yZGluZyB0byB0aGVpciBsaW5lLiBUaGUgbnVyc2VyaWVzIGFyZSBsZWZ0IHRoZXJlIGZvciBvbmUgdG8gdHdvIHdlZWtzIGJlZm9yZSBiZWluZyB0cmF5ZWQuIE1pZHdheSB0aHJvdWdoLCBpdCBpcyBnb29kIHRvIG1peCBhbmQgYWVyYXRlIHRoZSBudXJzZXJpZXMgdG8gcHJldmVudCBhbnkgY2FraW5nIG9mIHRoZSBjaGlja2VuIGZlZWQuIA0KDQoNClVzaW5nIGNoaWNrZW4gZmVlZCAofiQzL2tnKSBudXJzZXJpZXMgd2lsbCBhZGQgb24gcXVpdGUgYSBzdWJzdGFudGlhbCBhbW91bnQgdG8gb3VyIGV4cGVuc2VzLiBGb29kIHdhc3RlIG51cnNlcmllcyBhcmUgcHJvYmFibHkgbW9yZSBmaW5hbmNpYWxseSBzdXN0YWluYWJsZSBidXQgaXQgbWlnaHQgbGVhZCB0byBsb3NzZXMgZnJvbSBlc2NhcGVlcy4gV2UgaGF2ZSB0cmllZCBmb29kIHdhc3RlIG51cnNlcmllcyBiZWZvcmUgYnV0IGRpZCBub3QgcXVhbnRpZnkgbG9zc2VzLiBOdXJzZXJpZXMgY29tcHJpc2VkIG9mIGEgZm9vZCB3YXN0ZSArIGNoaWNrZW4gZmVlZCAob3Igb2thcmEpIG1peCBoYXZlIHNob3duIHRvIGJlIGVmZmVjdGl2ZSwgYW5kIGNvdWxkIG1pbmltaXplIGVzY2FwZXMgYnkgYmVpbmcgc2xpZ2h0bHkgZHJpZXIgYW5kIHByb3ZpZGUgbW9yZSBzdHJ1Y3R1cmUgdG8gdGhlIHN1YnN0cmF0ZS4gVGhpcyB3aWxsIHJlcXVpcmUgZnVydGhlciBpbnZlc3RpZ2F0aW9uIHRvIGRldGVybWluZSBhIHN1aXRhYmxlIG51cnNlcnkgbWl4Lg0KDQojIyMjIE1pc2MgdGlwcw0KDQoqIFdlIGJ1eSAyNWtnIG9mIGNoaWNrZW4gZmVlZCBlYWNoIHRpbWUuIFRoaXMgbGFzdHMgdXMgYWJvdXQgIDEtMiBtb250aHMgZGVwZW5kaW5nIG9uIHRoZSBhbW91bnQgb2YgZWdncyBjb2xsZWN0ZWQuIFdlIHN0b3JlIHRoZSBiYWcgb2YgY2hpY2tlbiBmZWVkIGluIGEgdmFjdXVtIGJhZyBhbmQgcmVtb3ZlIHRoZSBhaXIgdXNpbmcgYSB3ZXQvZHJ5IHZhY3V1bS4gVGhpcyBzZWVtcyB0byBhbGxvdyB1cyB0byBrZWVwIHRoZSBjaGlja2VuIGZlZWQgZnJlc2ggZm9yIGEgbG9uZ2VyIHRpbWUgYW5kIHByZXZlbnRzIHRoZSBzcHJlYWQgb2YgbWl0ZXMuIA0KDQoNCiogTGlnaHRseSBrbm9jayB0aGUgc2lkZSBvZiB0aGUgY2FnZSB0byBjaGFzZSB0aGUgZmxpZXMgYXdheSBiZWZvcmUgcmV0cmlldmluZyB0aGUgdHJhcC4gQSBxdWljayBmbGljayBvZiB0aGUgdHJhcCBzaG91bGQgZ2V0IHJpZCBvZiBtb3N0IGZsaWVzIHdpdGhvdXQgZGFtYWdpbmcgdGhlIGVnZ3MuIElmIHRoZSB0cmFwIGlzIHZlcnkgZnVsbCwgc3dlZXBpbmcgb2ZmIHRoZSBmbGllcyB3aXRoIGEgZmluZ2VyIG1pZ2h0IGJlIHByZWZlcmFibGUuIA0KDQoNCiogVGhlIEJTRnMgY29tbW9ubHkgb3ZpcG9zaXQgYWxvbmcgdGhlIHppcHMgb2YgdGhlIGNhZ2VzLiBJZiB5b3UgYXJlIG5vdCBjYXJlZnVsLCB5b3UgbWF5IGJyaW5nIGVnZ3MgZnJvbSBvbmUgY2FnZSB0byBhbm90aGVyIGFuZCBtaXggdXAgdGhlIGxpbmVzLiANCg0KDQotLS0NCg0KIyBUcmF5aW5nIGFuZCBmZWVkaW5nDQojIyBOdXJzZXJ5IHF1YW50aWZpY2F0aW9uIGFuZCB0cmF5aW5nDQpBZnRlciBhYm91dCA3LTEwIGRheXMsIHRoZSBudXJzZXJpZXMgc2hvdWxkIGJlIHJlYWR5IChkcnkpIHRvIGJlIHRyYXllZC4gU21hbGxlciBudXJzZXJpZXMgdGVuZCB0byBkcnkgdXAgc29vbmVyIHRoYW4gdGhlIGxhcmdlIG9uZXMuIEl0IG1pZ2h0IGJlIGhlbHBmdWwgdG8gcmVtb3ZlIHRoZSBjYXJkYm9hcmQgdHJhcHMgdG8gZW5jb3VyYWdlIG1vcmUgYWlyZmxvdyBhbmQgZmFzdGVyIGRyeWluZyB0aW1lcy4gV2V0IGNhcmRib2FyZCBhbHNvIHRlbmRzIHRvIGJyZWFrZG93biBpbiB0aGUgbnVyc2VyeSB3aGljaCBtYWtlcyBzaWV2aW5nIGl0IG1vcmUgZGlmZmljdWx0LiANCg0KT25jZSB0aGUgbnVyc2VyeSBpcyByZWFkeSAoZHJ5KSwgd2Ugd2lsbCByZW1vdmUgYXMgbXVjaCBzdWJzdHJhdGUgYXMgcG9zc2libGUgZnJvbSBlYWNoIG51cnNlcnkgKGllIGRyaWVkIGNsdW1wcyB3aXRoIG5vIGxhcnZhZSkuIFRoaXMgaXMgZG9uZSBieSBzaWV2aW5nIHRoZSBtaXh0dXJlIHRocm91Z2ggYW4gYXBwcm9wcmlhdGUgc21hbGwgc2lldmUgKH4xbW0gYW5kIH40bW0pLiBUaGUgcmVtYWluaW5nIGxhcnZhZSB0ZW5kcyB0byBjbHVtcCB0b2dldGhlciBpbiBwYW5pYyBhbmQgbW9yZSBzdWJzdHJhdGUgY2FuIGJlIHJlbW92ZWQgYnkgc2tpbW1pbmcgb2ZmIHRoZSB0b3Agc3Vic3RyYXRlLiBUaGUgbGFydmFlIGFuZCByZW1haW5pbmcgc3Vic3RyYXRlIHdpbGwgYmUgaG9tb2dlbml6ZWQuIFRoZSBudW1iZXIgb2YgbGFydmFlIGluIHRoZSBudXJzZXJ5IGlzIGVzdGltYXRlZCBieSBjb3VudGluZyB0aGUgbnVtYmVyIGluIGEgc21hbGwgc2FtcGxlICgzIHggfjEuNWcpLCB3aGljaCBpcyB0aGVuIGV4dHJhcG9sYXRlZCBiYXNlZCBvbiB0aGUgdG90YWwgd2VpZ2h0IG9mIHRoZSBudXJzZXJ5LiBUaGUgbGFydmFlIGFyZSB0aGVuIGRpc3RyaWJ1dGVkIGludG8gYmF0Y2hlcyBvZiBhcHByb3hpbWF0ZWx5IDEwLDAwMCwgd2hpY2ggYXJlIHRoZW4gYWRkZWQgdG8gZWFjaCBibHVlIHRyYXkgd2l0aCBmb29kIHdhc3RlLiANCg0KDQojIyBGZWVkaW5nDQpJZGVhbGx5LCBlYWNoIHRyYXkgd291bGQgYmUgZmVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9mIGl0J3MgbGlmZXNwYW4sIGVub3VnaCBmb3IgdGhlIG1hZ2dvdHMgdG8gcmVhY2ggbWF0dXJpdHkuIFdlIGhhdmUgZG9uZSBzb21lIHByZWxpbWluYXJ5IHRyaWFscyBhbmQgYSByYXRpbyBvZiAzLTVrZyA6IDEwLDAwMCBtYWdnb3RzIGluIGEgYmx1ZSB0cmF5IHNlZW0gdG8gZG8gcXVpdGUgd2VsbC4gSG93ZXZlciwgZHVlIHRvIGNvbmNlcm5zIHdpdGggb2RvdXJzIGFuZCBlc2NhcGVlcywgd2UgaGF2ZSBjaGFuZ2VkIHRvIG11bHRpcGxlIGZlZWRpbmdzLg0KDQpFYWNoIHRyYXkgc3RhcnRzIG91dCB3aXRoIG9uZSBsYXJnZSBzY29vcCBvZiBzcGVudCBncmFpbnMgb3Igb2thcmEgKH44MDBnPykuIEEgZGVwcmVzc2lvbiBpcyBtYWRlIGluIHRoZSBjZW50ZXIgb2YgdGhlIHNjb29wIGFuZCBhIHNjb29wIG9mIGZvb2Qgd2FzdGUgaXMgcGxhY2VkIGluIHRoZSBjZW50ZXIgaW4gdGhlIGRlcHJlc3Npb24uIFRoZSBncmFpbnMgcHJvdmlkZSBhIGRyeWVyIHN1YnN0cmF0ZSBhbmQgc2VlbSBxdWl0ZSBlZmZlY3RpdmUgaW4gZGlzY291cmFnaW5nIG1hZ2dvdHMgZnJvbSBlc2NhcGluZy4gRWFjaCBuZXcgdHJheSBpcyBsYWJlbGVkIGFzIHN1Y2g6IExpbmUtdHJheWRhdGUtcy9uLiBGb3IgZXhhbXBsZSBvZiBtYWdnb3RzIGZyb20gbGluZSBELCB0cmF5ZWQgb24gMTAgU2VwIDIwMjAgd2lsbCBiZSBsYWJlbGxlZCBhcyAnRC0xMDA5MjAyMC0wMScsICdELTEwMDkyMDIwLTAyJyBhbmQgc28gb24uIFRoZSBudXJzZXJ5IG51bWJlciBpcyBhbHNvIG5vdGVkIGRvd24gdG8gYWxsb3cgdXMgdG8gdHRyYWNrIHRoZSBwZXJmb3JtYW5jZSBvZiBzcGVjaWZpYyBudXJzZXJpZXMuIFRoZSB0cmF5cyBhcmUgdGhlbiBwbGFjZWQgb24gdGhlaXIgcmVzcGVjdGl2ZSByYWNrcy4NCg0KRm9yIGV4aXN0aW5nIHRyYXlzLCBhbiBhZGRpdGlvbmFsIHNjb29wIG9mIGZvb2Qgd2FzdGUgaXMgYWRkZWQgdG8gdGhlIHRyYXkgZXZlcnkgTW9uZGF5LCBXZWRuZXNkYXkgYW5kIEZyaWRheSBvciB3aGVuIHRoZSBzdWJzdHJhdGUgaXMgZHJ5LiBXaXRoIGNlcnRhaW4gdHlwZXMgb2YgZm9vZCB3YXN0ZXMgKHN1Y2ggYXMgYmlzY3VpdHMpLCB0aGUgc3Vic3RyYXRlIHRlbmRzIHRvIGRyeSBxdWlja2x5IGFuZCBjYWtlIHVwLiBXYXRlcmluZyBhbmQgbWl4aW5nIG1pZ2h0IG5lZWQgdG8gYmUgZG9uZSBvbiBhbiBhZCBob2MgYmFzaXMgaWYgeW91IG5vdGljZSBjYWtpbmcuIFRoaXMgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZSB3aXRoIGZvb2R3YXN0ZSwgb2thcmEgb3IgZ3JhaW5zLiBUaGUgdHJheXMgY29udGludWUgdG8gcmVjZWl2ZSBmb29kIHVudGlsIGFuIGVzdGltYXRlZCA0MCUgb2YgdGhlIGxhcnZhZSBoYXZlIHByZXB1cGF0ZWQuIA0KDQotLS0NCg0KIyBIYXJ2ZXN0aW5nDQojIyBTbWFsbCBzY2FsZSBoYXJ2ZXN0aW5nDQpJZiB5b3VyIGV4cGVyaW1lbnQgaXMgb24gYSBzbWFsbGVyIHNjYWxlICh5ZWxsb3cgdHJheXMgb3Igc21hbGxlciksIHlvdSBtYXkgY29uc2lkZXIgbGV0dGluZyB0aGUgbGFydmFlIHNlbGYgaGFydmVzdCBhcyBwcmVwdWFlIG1pZ3JhdGUgZnJvbSB3ZXR0ZXIgYXJlYXMgaW4gc2VhcmNoIG9mIGRyeSBzdWJzdHJhdGUgdG8gcHVwYXRlIGluLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHBsYWNpbmcgYSB5ZWxsb3cgdHJheSBpbiBhIGxhcmdlciBibHVlIHRyYXkgYW5kIGFkZGluZyBhIHdvb2RlbiByYW1wIG9uIHRoZSBzaG9ydCBzaWRlIG9mIHRoZSB5ZWxsb3cgdHJheS4gVGhlIHNlbGYgaGFydmVzdGluZyBtZXRob2Qgd2lsbCBub3QgZ2V0IGFsbCB0aGUgcHJlcHVwYWUgb3V0IGJ1dCBpdCBtYXkgYmUgc3VmZmljaWVudCBmb3IgeW91ciBuZWVkcy4gVGhpcyBjYW4gYmUgY29tYmluZWQgdG9nZXRoZXIgd2l0aCBtYW51YWwgaGFuZGhlbGQgc2lldmluZyB0byBnZXQgZXZlbiBtb3JlIHByZXB1cGFlIG91dCBvZiB0aGUgdHJheXMuIElmIHRoZSByZXN1bHRhbnQgZnJhc3MgaXMgbm90IGltcG9ydGFudCBhdCB0aGUgZW5kIG9mIHRoZSBleHBlcmltZW50LCB5b3UgbWF5IHdhbnQgdG8gZmxvb2QgdGhlIHllbGxvdyB0cmF5IGFuZCBhZGQgY29jbyBwZWF0IGluIHRoZSBibHVlIHRyYXkuIFRoaXMgd2lsbCBjaGFzZSBvdXQgbW9zdCBvZiB0aGUgcHJlcHVwYWUgYnV0IHRoZSBmcmFzcyBpcyBsb3N0Lg0KDQoNCiMjIExhcmdlIHNjYWxlIGhhcnZlc3RpbmcNCkZvciB0aGUgb3BlcmF0aW9ucyBvZiB0aGUgQlNGIGZhY2lsaXR5LCBzZWxmIGhhcnZlc3QgaXMgdG9vIHNsb3cuIEluc3RlYWQsIHdlIHVzZSB0aGUgbGFyZ2UgbWVjaGFuaWNhbCBzaWV2ZS4gSXQgY2FuIGZpdCB1cCB0byB0aHJlZSBsYXllcnMgb2Ygc2lldmVzIHdpdGggbWVzaGVzIG9mIGRpZmZlcmVudCBzaXplcy4gV2UgaGF2ZSBhIG51bWJlciBvZiBzaWV2ZXMgb2YgZGlmZmVyZW50IHNpemVzIHRoYXQgY2FuIGJlIHN3YXBwZWQgZGVwZW5kaW5nIG9uIHlvdXIgbmVlZHMgKDEwbW0sIDVtbSwgM21tIGV0YykuIFRoZSA1bW0gc2NyZWVuIGlzIG1vc3Qgb2Z0ZW4gdXNlZC4gVGhlIG1hZ2dvdCB0cmF5IHNob3VsZCBiZSBkcnkgb3IgdGhlIGZyYXNzIHdpbGwgY2x1bXAgdXAgYXQgdGhlIGJvdHRvbS4gDQoNCiFbRmlnIDIuIE1lY2hhbmljYWwgc2lldmUgd2l0aCBhbHRlcm5hdGl2ZSBzY3JlZW5zIGJlaGluZC5dKGltYWdlcy9zaWV2ZXIuanBnKXt3aWR0aD03MCV9DQoNCldoZW4gcmVhZHksIHR1cm4gdGhlIHNpZXZlIG9uIGFuZCBwb3VyIHRoZSB0cmF5IGluIHRoZSBjZW50ZXIgb2YgdGhlIHNjcmVlbi4gRmluZSBmcmFzcyB3aWxsIGZhbGwgdGhyb3VnaCB0byB0aGUgYm90dG9tIGxheWVyIHdoaWxlIGxhcmdlciBmcmFzcyBhbmQgbWFnZ290cyBhcmUgcmV0YWluZWQgb24gdGhlIHVwcGVyIGxheWVycy4gV2UgdXN1YWxseSBkbyB0d28gcGFzc2VzIHRocm91Z2ggdGhlIHNpZXZlIGJ5IHJlLXNpZXZpbmcgdGhlIGZpbmVzdCBmcmFzcy4gVGhpcyBzaG91bGQgcmVtb3ZlIG1vc3QgYWxsIG9mIHRoZSBwcmVwdXBhZSBmcm9tIHRoZSBmcmFzcy4gQ2xlYW4gdGhlIHNjcmVlbnMgYW5kIHRoZSBib3R0b20gdG8gZW5zdXJlIHRoYXQgKiptYWdnb3RzIG9mIGRpZmZlcmVudCBsaW5lcyBkbyBub3QgbWl4KiouIFJ1biB0aGUgc2lldmVyIGZvciBhIHNob3J0IHdoaWxlIHRvIGdldCB0aGUgc3RyYWdnbGVycyBvdXQgZnJvbSB0aGUgY2h1dGUgYmVmb3JlIG1vdmluZyBvbiB0byB0aGUgbmV4dCB0cmF5LiBJZiB5b3Ugbm90aWNlIGxvdWQgbm9pc2VzIHdoaWxlIHNpZXZpbmcsIHRoZSBudXRzIG1pZ2h0IG5lZWQgdG8gYmUgZnVydGhlciB0aWdodGVuZWQuIFRpZ2h0ZW5pbmcgKG9yIGxvb3NlbmluZykgY2FuIGJlIGRvbmUgcXVpY2tseSBieSB1c2luZyBhIGRyaWxsIHdpdGggYW4gYWRhcHRlciBmb3IgdGhlIG51dC4gSWYgdGhlIHRyYXkgaXMgc3RpbGwgd2V0LCB0aGUgc2lldmUgd2lsbCBub3Qgd29yayB3ZWxsLiBMZXQgdGhlIHRyYXkgZHJ5IG91dCBmb3IgYSBkYXkgYmVmb3JlIGFzc2Vzc2luZyBpdCBhZ2Fpbi4gDQoNCkFmdGVyIHNpZXZpbmcsIGEgZmV3IG1lYXN1cmVtZW50cyBmb3IgdGhlIHRyYXlzIGhhdmUgdG8gYmUgdGFrZW4uIEZpcnN0bHksIHdlIHdlaWdoIHRoZSBmcmFzcyBhbmQgcmVzaWR1ZSBwcm9kdWNlZCBieSB0aGUgdHJheS4gTmV4dCwgd2Ugd2VpZ2ggdGhlIG1hc3Mgb2YgdGhlIGxhcnZhZS4gIExhc3RseSwgcHJlcHVwYWUgcGVyY2VudGFnZSBpcyBlc3RpbWF0ZWQgYnkgY291bnRpbmcgYSBmZXcgc2FtcGxlcyBvZiBsYXJ2YWUuIFRoaXMgaXMgZG9uZSBmb3IgYSBtaW5pbXVtIG9mIHRocmVlIHJhbmRvbSB0cmF5cyBwZXIgYmF0Y2ggKHBlciBsaW5lIHBlciBkYXRlKS4gVGhlIGZyYXNzIGdvZXMgaW50byB0aGUgZGVzaWduYXRlZCBmcmFzcyBiaW5zIGZvciBjb21wb3N0aW5nIG9yIHN0b3JlZCBmb3IgYm90YW55IG9yIG90aGVyIGdhcmRlbmluZyBpbnRlcmVzdCBncm91cHMuIFRoZSB0cmF5cyBvZiBsYXJ2YWUgYXJlIHBsYWNlZCBpbnNpZGUgYSBsYXJnZSBjYWdlIGFuZCBnb2VzIHRvIHRoZSBkYXJrIHJvb20uIEVhY2ggY2FnZSBpcyB0byBoYXZlIGJldHdlZW4gb25lIHRvIHR3byB0cmF5cyB3b3J0aCBvZiBtYWdnb3RzICh0b3RhbCB+MjAsMDAwIHBlciBjYWdlKS4gUmVtZW1iZXIgdG8gbGFiZWwgdGhlIGNhZ2Ugc28gdGhhdCB3ZSBhcmUgYWJsZSB0byB0cmFjayB0aGUgYW1vdW50IG9mIGVnZ3MgZnJvbSBlYWNoIGNhZ2UuDQoNCiFbRmlnIDMuIEJTRiBmcmFzc10oaW1hZ2VzL0ZyYXNzLmpwZWcpe3dpZHRoPTUwJX0NCg0KQ3VycmVudGx5IChEZWMgMjAyMCksIHdlIGFyZSBzdGlsbCByZWJ1aWxkaW5nIG91ciBwb3B1bGF0aW9ucyBhZnRlciB0aGUgY2lyY3VpdCBicmVha2VyLiBXaGVuIGl0IHJlYWNoZXMgYSBwb2ludCB3aGVyZSB3ZSBoYXZlIG1vcmUgdGhhbiBlbm91Z2ggYWR1bHQgZmxpZXMsIHNvbWUgdHJheXMgY2FuIGJlIGhhcnZlc3RlZCBlYXJsaWVyIGZvciBvdGhlciBwdXJwb3Nlcy4NCg0KLS0tDQoNCiMgT2J0YWluaW5nIGVnZ3MNCiMjIExhcmdlIGNhZ2VzDQojIyMgRGFyaw0KT25jZSB0aGUgdHJheXMgYXJlIHBsYWNlZCBpbiB0aGUgY2FnZXMsIHRoZSBjYWdlcyBhcmUgcGxhY2VkIGluIHRoZSBkYXJrIHJvb20gdG8gYnVpbGQgdXAgYSBsYXJnZXIgcG9wdWxhdGlvbiBvZiBmbGllcy4gT25jZSBhIGxhcmdlIHBvcHVsYXRpb24gb2YgZmxpZXMgaXMgZXN0YWJsaXNoZWQgaW4gYSBjYWdlLCBpdCBpcyBicm91Z2h0IG91dCBpbnRvIHRoZSBpbnRvIGFuZCBwbGFjZWQgYWxvbmcgdGhlIHJvdyBvZiB3aW5kb3dzLiANCg0KIyMjIExpZ2h0DQpPbmNlIHRoZSBjYWdlIGlzIGJ5IHRoZSB3aW5kb3dzLCBhIHNtYWxsIHRyYXkgb2Ygc3VnYXIgd2F0ZXIgd2l0aCBzcG9uZ2VzIGNhbiBwbGFjZWQgaW4gdGhlIGNhZ2UgZm9yIHRoZSBmbGllcy4gVGhpcyBjYW4gYmUgdG9wcGVkIHVwIHR3aWNlIGEgd2Vlay4gVHdvIGRheXMgYWZ0ZXIgYmVpbmcgYnJvdWdodCBpbnRvIHRoZSBsaWdodCwgYSBiYWl0IGJveCB3aXRoIGFuIGVnZyB0cmFwIGlzIGFkZGVkIGludG8gdGhlIGNhZ2UuIFRoZSBiYWl0IGJveCBpcyBtYWRlIHVzaW5nIGNoaWNrZW4gZmVlZCBhbmQgZnJhc3MgZnJvbSBzaWV2aW5nLiBJdCBzaG91bGQgYmUgbWFkZSBtb3JlIHdhdGVyeSBhcyBpdCBpcyBleHBlY3RlZCB0byBsYXN0IGZvciBhdCBsZWFzdCAyIHdlZWtzLiBUaGVzZSBjYWdlcyBhcmUgbGl0IGJ5IG5hdHVyYWwgc3VubGlnaHQuIA0KDQohW0ZpZyA0LiBCU0YgYmFpdCBib3hlcyB3aXRoIHRyYXBzXShpbWFnZXMvdHJhcC5wbmcpe3dpZHRoPTMwJX0NCg0KDQojIyBYWEwgYW5kIGJleW9uZA0KSWYgdGhlIHJvdyBiZXNpZGUgdGhlIHdpbmRvdyBpcyBmdWxseSB1c2VkLCB3ZSBoYXZlIGEgYSBudW1iZXIgb2YgWFhMIGNhZ2VzIHNldCB1cCBhcm91bmQgdGhlIGZhY2lsaXR5IGFuZCBhIGdpYW50IGNhZ2UgaW4gdGhlIHNtYWxsIG9mZmljZS4gVGhlIFhYTCBjYWdlcyBhbmQgZ2lhbnQgY2FnZSBpbiB0aGUgcm9vbXMgYXJlIGxpdCB1c2luZyBhcnRpZmljaWFsIGxpZ2h0aW5nLiBUaGVzZSBhcmUgc3VwcG9zZWQgdG8gYmUgb3B0aW1pc2VkIGJhc2VkIG9uIHRoZSB2aXNpYmxlIHNwZWN0cnVtIG9mIHRoZSBCU0ZzLiBQbGVhc2Ugd2VhciBleWUgcHJvdGVjdGlvbiBiZWZvcmUgZ29pbmcgaW50byB0aGUgcm9vbXMgaWYgdGhlIGxpZ2h0cyBhcmUgb24uIFRoZSBlZ2cgcHJvZHVjdGlvbiB3aXRoIHRoZXNlIGNhZ2VzIGhhdmUgbm90IGJlZW4gYXMgZ29vZCBhcyB0aGUgbGFyZ2UgY2FnZXMsIHBlcmhhcHMgZHVlIHRvIGEgbG93ZXIgZGVuc2l0eSBidXQgbW9yZSB0ZXN0aW5nIHNob3VsZCBiZSBkb25lIMKvXFxcXyjjg4QpXF8vwq8uIA0KDQohW0ZpZyA1LiBXYXZlbGVuZ3RoIG9mIExFRHMgaW4gdGhlIHJvb21zIGZyb20gdGhlIG1hbnVmYWN0dXJlcl0oaW1hZ2VzL0xFRHMucG5nKXt3aWR0aD02MCV9DQoNCg0KIyMgRWdnIHRyYXBzDQpXZSBoYXZlIGltcGxlbWVudGVkIHRoZSB1c2Ugb2YgMiBkaWZmZXJlbnQgdHlwZXMgb2YgZWdnIHRyYXBzOiB3b29kZW4gdHJhcHMgYW5kIGNhcmRib2FyZCB0cmFwcy4gTGFiZWwgY2FnZSB0aGUgdHJhcCBpcyBmcm9tIHNvIHRoYXQgd2UgY2FuIHRyYWNrIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgY2FnZXMuIFRyYXBzIGFyZSByZXBsYWNlZCBldmVyeSBNb25kYXksIFdlZG5lc2RheSBhbmQgRnJpZGF5IHVudGlsIHRoZSBjYWdlIGlzIGRlY29tbWlzc2lvbmVkIHdoZW4gbW9zdCBvZiB0aGUgZmxpZXMgaGF2ZSBkaWVkLiANCg0KIyMjIFdvb2RlbiB0cmFwDQpXb29kZW4gdHJhcHMgYXJlIG1hZGUgYnkgYnVuZGxpbmcgZm91ciBsYXllcnMgb2Ygd29vZCwgc2VwYXJhdGVkIGJ5IHRoaW4gd29vZGVuIHNwYWNlcnMuIE1vcmUgdHJhcHMgY2FuIGJlIG1hZGUgYnkgY3V0dGluZyB3b29kZW4gcGxhbmtzIHRvIHNpemUgd2l0aCB0aGUgc2F3LiBVc2luZyB3b29kZW4gdHJhcHMsIGVnZ3MgY2FuIGJlIGdlbnRseSBzY3JhcGVkIG91dCB1c2luZyBhIHBlbmtuaWZlIHRvIG9idGFpbiB0aGUgZWdnIHdlaWdodC4gU2NyYXAgYWxvbmcgdGhlIHdvb2RlbiBncmFpbiB0byBtaW5pbWlzZSBkYW1hZ2UgdG8gZWdncy4gVGhlIGVnZ3MgYXJlIHNjcmFwZWQgb3V0IG9udG8gYSB0aGluIHBsYXN0aWMgY2FyZCB3aGljaCBjYW4gYmUgcGxhY2VkIGluIHRoZSBudXJzZXJ5LiBUaGUgdHJhcHMgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSBkZWh5ZHJhdG9yIGZvciBvbmUgdG8gdHdvIGhvdXJzIHRvIGtpbGwgb2ZmIGFueSByZW1haW5pbmcgZWdncy4gT25jZSBjb29sZWQsIHRoZSB0cmFwIGNhbiBiZSB1c2VkIGFnYWluLg0KDQohW0ZpZyA2LiBFeGFtcGxlIG9mIGEgd29vZGVuIHRyYXBdKGltYWdlcy93b29kZW4gdHJhcC5qcGcpe3dpZHRoPTMwJX0NCg0KIyMjIENhcmRiYW9yZCB0cmFwcy4NCkNhcmRib2FyZCB0cmFwcyBhcmUgbWFkZSAgYnkgYnVuZGxpbmcgMy00IGxheWVycyBvZiBjYXJkYm9hcmQuIEVhY2ggdHJhcCBpcyBhcHByb3hpbWF0ZWx5IDE1eDEuNWNtLiBBZnRlciB0aGUgdHJhcCBoYXMgYmVlbiBzZWN1cmVkIHdpdGggYSBydWJiZXIgYmFuZCwgd2VpZ2ggdGhlIHRyYXAgYW5kIHdyaXRlIGl0IG9uIHRoZSBjYXJkYm9hcmQuIFRoZSB3ZWlnaHQgb2YgZWdncyBvbiB0aGUgdHJhcCBjYW4gYmUgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcgdGhlIGZpbmFsIHdlaWdodCBmcm9tIHRoZSBpbml0aWFsIHdlaWdodCBvZiB0aGUgdHJhcC4gVGhlIGNhcmRib2FyZCB0cmFwcyBjYW4gYmUgcGxhY2VkIGRpcmVjdGx5IGluIHRoZSBudXJzZXJpZXMuDQoNCiFbRmlnIDcuIEV4YW1wbGUgb2YgYSBjYXJkYm9hcmQgdHJhcF0oaW1hZ2VzL2NhcmRib2FyZCB0cmFwLmpwZyl7d2lkdGg9MzAlfQ0K